package com.kexio.file.storage;

import com.kexio.file.dto.FileChunk;
import com.kexio.file.dto.FileUploadRequest;
import com.kexio.file.dto.FileUploadResult;

import java.io.InputStream;
import java.util.List;

/**
 * 文件存储策略接口
 * 
 * @author kexio
 */
public interface StorageStrategy {

    /**
     * 存储类型
     */
    String getStorageType();

    /**
     * 上传文件
     *
     * @param request 上传请求
     * @param inputStream 文件流
     * @return 上传结果
     */
    FileUploadResult upload(FileUploadRequest request, InputStream inputStream);

    /**
     * 下载文件
     *
     * @param storageKey 存储键
     * @return 文件流
     */
    InputStream download(String storageKey);

    /**
     * 删除文件
     *
     * @param storageKey 存储键
     * @return 是否成功
     */
    boolean delete(String storageKey);

    /**
     * 检查文件是否存在
     *
     * @param storageKey 存储键
     * @return 是否存在
     */
    boolean exists(String storageKey);

    /**
     * 获取文件访问URL
     *
     * @param storageKey 存储键
     * @param expireSeconds 过期时间（秒）
     * @return 访问URL
     */
    String getAccessUrl(String storageKey, int expireSeconds);

    /**
     * 初始化分片上传
     *
     * @param request 上传请求
     * @return 上传ID
     */
    String initMultipartUpload(FileUploadRequest request);

    /**
     * 上传分片
     *
     * @param uploadId 上传ID
     * @param chunk 分片数据
     * @return 分片标识
     */
    String uploadChunk(String uploadId, FileChunk chunk);

    /**
     * 合并分片
     *
     * @param uploadId 上传ID
     * @param chunkIds 分片ID列表
     * @return 上传结果
     */
    FileUploadResult mergeChunks(String uploadId, List<String> chunkIds);

    /**
     * 取消分片上传
     *
     * @param uploadId 上传ID
     * @return 是否成功
     */
    boolean abortMultipartUpload(String uploadId);

    /**
     * 复制文件
     *
     * @param sourceKey 源文件键
     * @param targetKey 目标文件键
     * @return 是否成功
     */
    boolean copy(String sourceKey, String targetKey);

    /**
     * 获取文件元信息
     *
     * @param storageKey 存储键
     * @return 文件元信息
     */
    StorageMetadata getMetadata(String storageKey);
}
